package vista;

import interfaces.IDibujable;
import interfaces.IFantasma;
import interfaces.ILaberinto;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.geom.Line2D;
import java.util.ArrayList;

import javax.swing.ImageIcon;

import utilidades.Constantes;
import utilidades.UtilidadesDeArchivos;
import utilidades.Vector;

public class GraficosDelFantasma implements IDibujable{
	private IFantasma fantasma;
	private ILaberinto nivel;
	private int indiceDeEstado;
	private ArrayList<Image> imagenes, imagenesPresa;	
	boolean modoDebug;

	static final int INDICE_MUERTO = 4;

	public GraficosDelFantasma(String[] paths,String[] pathsPresa,IFantasma ghost,ILaberinto nivel,boolean debugMode){
		this.fantasma = ghost;
		this.nivel = nivel;
		this.indiceDeEstado = 0;
		this.modoDebug = debugMode;
		this.imagenes = new ArrayList<Image>();
		this.imagenesPresa = new ArrayList<Image>();
		cargarImagenes(paths,pathsPresa);
	}
	
	private void cargarImagenes(String[] imgPath,String[] imgPathPresa){
		for (int i=0; i<5 ;i++){
			imagenes.add(new ImageIcon(UtilidadesDeArchivos.completarRuta(imgPath[i])).getImage());
			imagenesPresa.add(new ImageIcon(UtilidadesDeArchivos.completarRuta(imgPathPresa[i])).getImage());
		}
	}

	public void estadoSiguiente(){
		indiceDeEstado = (indiceDeEstado+1)%5;
	}

	public void cambiarEstado(int state){
			indiceDeEstado = state;				
	}

	public void cambiarEstado(Vector state){
		if(state.esIgualA(Constantes.IZQUIERDA))
			indiceDeEstado = 0;

		if(state.esIgualA(Constantes.DERECHA))
			indiceDeEstado = 1;
		
		if(state.esIgualA(Constantes.ARRIBA))
			indiceDeEstado = 2;
		
		if(state.esIgualA(Constantes.ABAJO))
			indiceDeEstado = 3;
	}

	private Image obtenerImagen(){
		if(fantasma.esPresa())
			return imagenesPresa.get(indiceDeEstado);
		if(fantasma.estaMuerto())
			return imagenesPresa.get(INDICE_MUERTO);
		else
			return imagenes.get(indiceDeEstado);
	}
	
	public void dibujar(Graphics g) {
		cambiarEstado(fantasma.obtenerUltimaDireccion());

		int anchoCasilla = Constantes.ANCHO_PANTALLA / nivel.obtenerCantidadColumnas(); 
		int altoCasilla = Constantes.ALTO_PANTALLA / nivel.obtenerCantidadFilas(); 
		
		Vector posicion = fantasma.obtenerPosicion();
		int centroX = posicion.obtenerCoordenadaX()*anchoCasilla + Constantes.OFFSET_CASILLAS_X;
		int centroY = posicion.obtenerCoordenadaY()*altoCasilla + Constantes.OFFSET_CASILLAS_Y;

		Image imagen = obtenerImagen();
		g.drawImage(imagen,centroX-Constantes.ANCHO_IMAGEN/2,centroY-Constantes.ANCHO_IMAGEN/2,Constantes.ANCHO_IMAGEN,Constantes.ALTO_IMAGEN,null);
		
		if(modoDebug){
			Graphics2D g2 = (Graphics2D)g;
			g2.setStroke(new BasicStroke(3));
			g.setColor(new Color(255,0,0));

			g2.draw(new Line2D.Float(centroX,centroY,centroX,centroY));	
		}	
	}
}
